Danish art 'motivs' from Wikidata

'Motivs' (depictions) in Danish artworks present in Wikidata.


In [1]:
import pandas as pd
import sparql
import numpy as np
import networkx as nx
import matplotlib.pyplot as plt

In [2]:
# Formulation of a query to Wikidata 
service = sparql.Service("https://query.wikidata.org/sparql", method="GET")
statement = """
PREFIX wikibase: <http://wikiba.se/ontology#>
PREFIX wd: <http://www.wikidata.org/entity/> 
PREFIX wdt: <http://www.wikidata.org/prop/direct/>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX p: <http://www.wikidata.org/prop/>
PREFIX v: <http://www.wikidata.org/prop/statement/>

SELECT ?artwork ?artworkLabel ?motiv ?motivLabel ?filename WHERE {
   ?artwork wdt:P31 wd:Q3305213 .
   ?artwork wdt:P180 ?motiv .        
   ?artwork wdt:P195 ?collection .
   ?collection wdt:P17 wd:Q35 .

   OPTIONAL {?artwork wdt:P18 ?filename } 

   SERVICE wikibase:label {
     bd:serviceParam wikibase:language "da,en" .
   } 
 }
"""

In [3]:
# Querying Wikidata and formatting it for a DataFrame
result = service.query(statement)
df = pd.DataFrame(result.fetchall(), columns=result.variables)

In [4]:
df.shape


Out[4]:
(2433, 5)

In [5]:
# Show a bit of the download data
df.head()


Out[5]:
artwork artworkLabel motiv motivLabel filename
0 http://www.wikidata.org/entity/Q12332504 Præsentation for en kender http://www.wikidata.org/entity/Q1259917 violinist http://commons.wikimedia.org/wiki/Special:File...
1 http://www.wikidata.org/entity/Q20010686 Skagensjægere http://www.wikidata.org/entity/Q25391 klit http://commons.wikimedia.org/wiki/Special:File...
2 http://www.wikidata.org/entity/Q20010686 Skagensjægere http://www.wikidata.org/entity/Q38774 jagthund http://commons.wikimedia.org/wiki/Special:File...
3 http://www.wikidata.org/entity/Q20010686 Skagensjægere http://www.wikidata.org/entity/Q468252 Michael Ancher http://commons.wikimedia.org/wiki/Special:File...
4 http://www.wikidata.org/entity/Q20010686 Skagensjægere http://www.wikidata.org/entity/Q6051740 Ulrik Plesner http://commons.wikimedia.org/wiki/Special:File...

In [6]:
# Set up feature matrix
motivs = set([item.value for item in df['motivLabel']])
artworks = set([item.value for item in df['artwork']])
feature_matrix = pd.DataFrame(0, index=artworks, columns=motivs)
artwork_mapper = {}
filename_mapper = {}
for n, row in df.iterrows():
    artwork = row['artwork'].value
    motiv = row['motivLabel'].value
    feature_matrix.ix[artwork, motiv] = 1 
    artwork_mapper[artwork] = row['artworkLabel'].value
    filename_mapper[artwork] = str(row['filename'])[51:]

In [7]:
feature_matrix.shape


Out[7]:
(571, 896)

In [8]:
# Show a bit of the constructed feature matrix
feature_matrix.head()


Out[8]:
Ernst Meyer papegøje Ambolt trappe HMS Shannon Capri stynede træer gang ørering skib ... København bænk Dollerup Bakker Søndagsskole fest Alkyone foredrag terrasse dysse skygge
http://www.wikidata.org/entity/Q22340518 0 0 0 0 0 0 0 0 0 0 ... 0 0 0 0 0 0 0 0 0 0
http://www.wikidata.org/entity/Q20532767 0 0 0 0 0 0 0 0 0 0 ... 0 0 0 0 0 0 0 0 0 0
http://www.wikidata.org/entity/Q20540698 0 0 0 0 0 0 0 0 0 0 ... 0 0 0 0 0 0 0 0 0 0
http://www.wikidata.org/entity/Q20540929 0 0 0 0 0 0 0 0 0 0 ... 0 0 0 0 0 0 0 0 0 0
http://www.wikidata.org/entity/Q20355485 0 0 0 0 0 0 0 0 0 0 ... 0 0 0 0 0 0 0 0 0 0

5 rows × 896 columns


In [9]:
# Some arbitrary scaling - more research needed here
scaled_feature_matrix = feature_matrix.copy()
scaled_feature_matrix = scaled_feature_matrix.divide((feature_matrix.sum(axis=1)) ** 0.9, axis='index')
scaled_feature_matrix = scaled_feature_matrix.divide((feature_matrix.sum(axis=0)) ** 0.05, axis='columns')

In [10]:
# Machine learning decomposition with non-negative matrix factorization
from sklearn.decomposition import NMF
decomposer = NMF(n_components=12)
decomposer.fit(scaled_feature_matrix)
transformed = decomposer.transform(scaled_feature_matrix)

In [11]:
# Show the results
for topic_id in range(decomposer.components_.shape[0]):
    indices = (-decomposer.components_[topic_id, :]).argsort()[:10]
    s = ""
    for index in indices:
        s += "%s (%f) " %  (scaled_feature_matrix.columns[index], 
                            decomposer.components_[topic_id, index])
    print(s + '\n')


kvinde (2.813067) nøgenhed (0.109899) tørklæde (0.076774) ager (0.076171) have (0.075465) bord (0.069592) læsning (0.069085) Anna Dorothea Therbusch (0.065968) Dianthus caryophyllus (0.065968) Susanna (0.065571) 

mand (1.714280) Ferdinand Meldahl (0.100443) Baret (0.073555) skæg (0.070825) fisker (0.065111) bog (0.059392) barn (0.052029) N.F.S. Grundtvig (0.051175) Fritz Melbye (0.050317) Henri Matisse (0.050317) 

himmel (1.264783) sky (0.880521) sejlskib (0.219555) strand (0.131058) vej (0.121052) hav (0.112295) solnedgang (0.089970) kyst (0.075524) gravhøj (0.073034) Fyrreslægten (0.072058) 

træ (1.678035) kirke (0.433185) hus (0.190315) sne (0.147630) gruppe af mennesker (0.121422) Laterankirken (0.107985) tamkvæg (0.089141) vinter (0.083785) gadekær (0.080518) himmel (0.079368) 

pige (1.388884) syning (0.373608) Almindelig Solsikke (0.139515) Girl in a Picture Frame (0.139515) kjole (0.134202) vindue (0.074492) spejl (0.072843) Pile-slægten (0.066965) stær (0.066965) seng (0.060235) 

hund (1.343440) barn (0.254867) bog (0.141191) dreng (0.089981) familie (0.084209) smagssans (0.082010) kurv (0.074655) Bjørne (0.072584) Fugle (0.053416) dør (0.053169) 

bjerg (1.296636) flod (0.228010) Borgund stavkirke (0.213742) vandfald (0.140211) gård (0.117280) hytte (0.110420) borg (0.107786) Dun-Birk (0.102670) last quarter (0.095608) sky (0.073653) 

Bertel Thorvaldsen (1.266971) lampe (0.022722) siddende (0.021935) gruppe af mennesker (0.021752) Natten (0.021682) bænk (0.021595) kat (0.021275) staffeli (0.020851) voldgrav (0.020409) Nysø (0.020409) 

Ribe Domkirke (1.613427) Aarhus Domkirke (0.000000) Korvet (0.000000) Michael Ancher (0.000000) strand (0.000000) fisker (0.000000) sejlskib (0.000000) båd (0.000000) Galathea 1 (0.000000) kanon (0.000000) 

Marie Krøyer (1.301337) P.S. Krøyer (0.187719) rose (0.146529) have (0.103464) strand (0.074236) sommer (0.045028) aften (0.044217) Anna Ancher (0.033616) sejlskib (0.026352) Michael Ancher (0.020169) 

Ida Ilsted (0.771598) hat (0.591223) stol (0.505919) siddende (0.487276) bord (0.331027) vindue (0.267874) dør (0.218805) maleri (0.168735) ryg (0.144803) stående (0.126405) 

skov (1.122667) vej (0.541597) sne (0.355547) Elleslægten (0.169609) eg (0.105070) hegn (0.084086) hus (0.069445) ager (0.053607) Søndermarken (0.050808) Furesø (0.044150) 


In [12]:
topic_ids = transformed.shape[1]
for topic_id in range(topic_ids):
    print('\nTopic %d' % (topic_id + 1,))
    indices = (-decomposer.components_[topic_id, :]).argsort()[:5]
    s = ""
    for index in indices:
        s += "%s (%f) " %  (scaled_feature_matrix.columns[index], 
                            decomposer.components_[topic_id, index])
    print(s + '\n')
    indices = (-transformed[:, topic_id]).argsort()[:20]
    for index in indices:
        print("%f %s" % (transformed[index, topic_id], artwork_mapper[feature_matrix.index[index]]))


Topic 1
kvinde (2.813067) nøgenhed (0.109899) tørklæde (0.076774) ager (0.076171) have (0.075465) 

0.277335 Dame ved sit toilette
0.277335 Prinsesse Wilhelmine, Frederik VI's datter
0.277335 Modellen Stella i Rom
0.277335 Portræt af lensgrevinde Lillie Suzanne Raben-Levetzau
0.277335 Olga Buhre
0.277335 En gammel kone
0.277335 Portrait of a 39-year-old Woman
0.153410 Portræt af gammel bondekone
0.153161 Et hjørne af haven i Éragny. Kunstnerens hjem
0.153074 Kartoffelgravning
0.153031 Kvinde med nellike
0.153031 Selvportræt
0.152918 Læsende dame
0.152756 Susanna. Skitse
0.152710 En ung pige, der plukker en svane
0.152539 Cathrine Jensen, f. Lorenzen, kunstnerens hustru med turban
0.152396 Tahitian Woman with a Flower
0.150653 Skuespillerinden Johanne Cathrine Rosing
0.149607 Portræt af en ung pige. Kunstnerens søster, Anna Hammershøi
0.148258 Skovlandskab. Forår

Topic 2
mand (1.714280) Ferdinand Meldahl (0.100443) Baret (0.073555) skæg (0.070825) fisker (0.065111) 

0.448276 Studie af en romersk morraspiller
0.448276 Portræt af en mand,
0.448276 Mandsportræt
0.448276 Studie af et oldingehoved i profil
0.257461 Arkitekt, Professor F. Meldahl, siddende
0.257461 Portræt af arkitekten F. Meldahl
0.252847 Skitse til Ridderen med falken, kendt som “Korsridderen”
0.250643 Portræt af en fisker fra Hornbæk
0.249164 Portræt af Rembrandt med ringkrave
0.249164 Baron Otto Ditlev Rosenørn-Lehn
0.249164 Self-Portrait in a Striped T-shirt
0.249164 Portræt af maleren Fritz Melbye (1826-69)
0.249164 Selvportræt (1857)
0.249038 Mandsportræt
0.249007 N.F.S. Grundtvig
0.248844 En herre i pels (kunstnerens fader)
0.178947 Mand med perlebesat baret
0.178220 Mandsportræt med pibekrave, Sully ?
0.178126 Portræt af en gammel jøde
0.177355 Portræt af en orientaler

Topic 3
himmel (1.264783) sky (0.880521) sejlskib (0.219555) strand (0.131058) vej (0.121052) 

0.360980 Studie af skyer over Øresund
0.226038 Vid udsigt fra Girgenti
0.224510 Fyrretræer
0.206436 Sommernat. Høsterkøb
0.206292 Udsigt over København ved solens nedgang
0.203884 Højvande
0.203613 Folkeliv ved havnen i Palermo
0.203188 Egetræer i Nordskoven ved Jægerspris
0.201825 Landskab ved Blokhus
0.201291 Det russiske linjeskib "Asow" og en fregat til ankers på Helsingørs red
0.200971 Dollerup Bakker i nærheden af Hald
0.200651 Michelangelos cypresser i klosteret i Diocletians bade
0.200384 Fjorden ved Karrebæksminde
0.194778 Kæmpehøj på Brandsø. Studie
0.187883 Stille eftermiddag udover sandgrundene ved Lynæs
0.187714 Søstykke med et vrag
0.179772 Et søstykke. Kysterne af Rügen set i aftenrøden efter en stormfuld dag
0.172563 Uvejr over havet
0.171650 Køerne går over fladstranden i Odense Fjord
0.170173 Frederiksborg Slot set fra Jægerbakken. Aften

Topic 4
træ (1.678035) kirke (0.433185) hus (0.190315) sne (0.147630) gruppe af mennesker (0.121422) 

0.294909 Efter solnedgang. "Nu skrider Dagen under, og Natten vælder ud"
0.294909 Landskab med popler. Septemberaften
0.247993 Klostergården i San Giovanni in Laterano i Rom
0.247484 Scene af det offentlige liv i Orienten. Motiv ved karavanebroen i nærheden af Smyrma.
0.243525 Malkeplads ved Dyrehavegård
0.218803 Inde i skoven
0.218803 I udkanten af skoven
0.217741 Vinterlandskab, Éragny, aften.
0.186936 Gadekæret i Ring
0.181558 Slindebirken, vinter
0.172683 Landevejen ved Mogenstrup. Efterår
0.172049 Lundbyes bænk ved Arresø
0.170662 Egetræer ved kæret
0.170600 Parti ved Lyngby Sø
0.165318 Portræt af den venezianske maler Giovanni Bellini
0.165318 Udsigt ved Jungshoved
0.165174 Lysning i Nordskoven ved Jægerspris
0.164383 Frederiksborg slot i måneskin
0.163427 Bjørn i kamp med hunde
0.154307 Vinterlandskab ved Vordingborg

Topic 5
pige (1.388884) syning (0.373608) Almindelig Solsikke (0.139515) Girl in a Picture Frame (0.139515) kjole (0.134202) 

0.555029 Portræt af Stella Kähler. Studie
0.383689 Syende fiskerpige
0.383689 Ung pige med sytøj
0.331956 En ung kvinde med hænderne hvilende på billedrammen
0.331956 Pigen med solsikkerne
0.329510 En lille pige, Helga Melchior, i lang kjole
0.265496 To småpiger får undervisning i syning
0.229502 Foråret
0.221268 Aftenbøn
0.180642 Interiør
0.174995 En ung pige, Sophie Lofthus, med en hund
0.174859 Moder fortæller. Kunstnerens hustru og datter
0.167859 To børn begraver en fugl
0.137810 Gade i Torello
0.101760 Solskin i den blå stue
0.089895 Forår. Ebba og Sigrid Kähler
0.078092 En matros, som tager afsked med sin pige
0.059452 Det Hirschsprungske familiebillede
0.015956 Syende kvinde
0.014606 Skumring. Kunstnerens hustru ved kakkelovnen

Topic 6
hund (1.343440) barn (0.254867) bog (0.141191) dreng (0.089981) familie (0.084209) 

0.564769 Bologneserhund
0.300533 Dame med hund
0.273519 To ynglinge med en hund
0.240290 Dreng med en hund. (Allegori på "Smagen")
0.222243 Bjørn i kamp med hunde
0.207555 Sommeraften ved Skagen. Kunstnerens hustru med hund ved strandkanten
0.187517 Portrætgruppe med kunstnerens fader Amilcare Anguissola og hendes søskende Minerva og Astrubale
0.185429 Jæger med bøsse og hund. (Allegori på "Luften")
0.172402 Melankolien
0.167995 En ung pige, Sophie Lofthus, med en hund
0.147407 Ulrik Christian Gyldenløve
0.144700 Udsigt over Athen fra sydvest
0.134004 En jæger viser sin kone udbyttet af den første sneppejagt. Portræt af hofjægermester Chr. Fr. Zeuthen og hustru, Sophie Hedevig
0.132032 Niels Ryberg med sin søn Johan Christian og svigerdatter Engelke, f. Falbe
0.122272 En hyrdinde med en hund
0.120713 Susanne og de to ældste
0.117855 En sædemand
0.117562 Summum jus, summa injuria. Barnemordet
0.116168 Musicerende selskab
0.105180 En romersk gadeskriver skriver et brev for en ung pige

Topic 7
bjerg (1.296636) flod (0.228010) Borgund stavkirke (0.213742) vandfald (0.140211) gård (0.117280) 

0.617064 Norsk landskab, Jordalsnuten
0.391837 Stavkirken, Borgund
0.390269 Bjerglandskab med en flod
0.271107 Landskab fra øvre Telemark
0.255937 Landskab fra Saint Rémy
0.228617 Et vandfald i en bjergegn
0.187167 En bjergstrøm
0.157628 Udsigt over Athen fra sydvest
0.136010 Norsk landskab med klippeparti i forgrunden
0.133736 Landskab med vandfald og hytte
0.052807 Broen over Tryggevælde å med udsigt til Køge
0.050437 Landskab, vandfald
0.023008 Bjerglandskab med en flod
0.018550 Indhegnede grønninger ved en gård med en storkerede på taget
0.016442 Dollerup Bakker i nærheden af Hald
0.015552 Landskab ved Blokhus
0.015370 Sandskrænt
0.015155 Udsigt mod Tivoli i Italien
0.014646 En jagt af kongelige personer
0.013587 Grækerne henter Vand fra Brønden ved Vindens Taarn i Athen

Topic 8
Bertel Thorvaldsen (1.266971) lampe (0.022722) siddende (0.021935) gruppe af mennesker (0.021752) Natten (0.021682) 

0.718943 Portræt af Bertel Thorvaldsen
0.718943 Portræt af Thorvaldsen
0.137306 Thorvaldsen modellerer "Natten"
0.131056 Herregården Nysø med Thorvaldsen udenfor sit atelier
0.130944 Thorvaldsens modtagelse på Toldboden, 17 September 1838
0.080815 Danske kunstnere i osteriet La Gensola i Trastevere
0.008340 Maleren Albert Küchler
0.005533 Scene af det offentlige liv i Orienten. Motiv ved karavanebroen i nærheden af Smyrma.
0.004946 Portræt af en ung pige. Kunstnerens søster, Anna Hammershøi
0.004544 Hjemvendt familie på et torv i måneskin
0.004041 Lundbyes bænk ved Arresø
0.003992 Moder fortæller. Kunstnerens hustru og datter
0.003748 Sognefogeden
0.003620 Fra et romersk osteria
0.003564 På kirkegården i Fløng
0.003553 Portræt af landskabsmaleren Frederik Sødring
0.003549 Lampelys. Interiør med kunstnerens hustru
0.003291 Broen over Tryggevælde å med udsigt til Køge
0.002942 Portræt af kritikeren og forfatteren Georg Brandes
0.002902 Maleren Sigurd Swane

Topic 9
Ribe Domkirke (1.613427) Aarhus Domkirke (0.000000) Korvet (0.000000) Michael Ancher (0.000000) strand (0.000000) 

0.586671 Ribe Domkirkes indre
0.586671 Interiør. Ribe domkirke
0.586671 Ribe Domkirke
0.000000 Interiør fra Århus Domkirke
0.000000 Parti i Århus Domkirke
0.000000 En korvet, som indtager reb i merssejlene i en tiltagende kuling og nogle andre sejlere
0.000000 Selvportræt
0.000000 Maler Michael Ancher
0.000000 Korvetten "Galathea" i en storm i Nordsøen
0.000000 Korvetten "Najaden"s styrbords batteri og dæk
0.000000 Fiskere på Nordstranden en sommeraften
0.000000 Fiskere på Skagens strand
0.000000 Båden sættes i søen. Skagen
0.000000 Morgen ved Hornbæk. Fiskerne kommer i land
0.000000 Dagens arbejde bedømmes
0.000000 Vil han klare pynten?
0.000000 Søstudie. Skagen
0.000000 Fiskere trækker vod på Skagen Nordstrand. Sildig eftermiddag
0.000000 Portræt af en fisker fra Hornbæk
0.000000 Indsejlingen til København

Topic 10
Marie Krøyer (1.301337) P.S. Krøyer (0.187719) rose (0.146529) have (0.103464) strand (0.074236) 

0.656781 Interiør med Marie Krøyer
0.656781 Marie Krøyer
0.404832 Dobbeltportræt af Marie og P.S. Krøyer
0.293662 Roser. Haveparti fra Skagen med kunstnerens hustru siddende i en havestol
0.243466 Sommeraften ved Skagen. Kunstnerens hustru med hund ved strandkanten
0.177593 Sommeraften ved Skagen Sønderstrand
0.109304 Sommeraften ved Skagens strand. Kunstneren og hans hustru
0.094677 En aften hos veninden. Ved lampelys
0.091200 Ved frokosten. Kunstneren, hans hustru og forfatteren Otto Benzon
0.079729 Pink Roses
0.032746 Kunstdommere
0.027471 Et hjørne af haven i Éragny. Kunstnerens hjem
0.024533 Selvportræt
0.021943 Blomstrende blommetræer, Éragny. Kunstnerens hjem
0.017579 Badende drenge en sommeraften ved Skagens strand
0.017332 Fiskere på Nordstranden en sommeraften
0.016146 Have med figurer
0.015614 Søstudie. Skagen
0.015037 Fiskere på Skagens strand
0.014441 I havedøren. Kunstnerens hustru

Topic 11
Ida Ilsted (0.771598) hat (0.591223) stol (0.505919) siddende (0.487276) bord (0.331027) 

0.391895 Kunstnerens hustru Ida, f. Ilsted
0.359271 Ida Ilsted, kunstnerens forlovede
0.332955 Portræt af Ida Ilsted, senere kunstnerens hustru
0.248633 Interiør, ung kvinde set fra ryggen
0.183085 Maleren Sigurd Swane
0.176332 Selvportræt med blød Hat
0.151164 Portræt af kritikeren og forfatteren Georg Brandes
0.144322 Portræt af den svenske pianist Hanna Lucia Bauck
0.141222 Modellen Maddalena
0.134221 Mandolinspiller
0.133971 Stue i Louis XVI stil
0.125803 Skumring. Kunstnerens hustru ved kakkelovnen
0.124429 Den svenske malerinde Jeanna Bauck
0.117085 Bedsteforældrenes søndag
0.116704 Blind kone i sin stue
0.115488 Ved frokosten
0.112100 Portræt af en ung pige. Kunstnerens søster, Anna Hammershøi
0.111767 Interiør fra Amaliegade. Artillerikaptajn Carl Ludvig Bendz stående og læge Jacob Christian Bendz siddende
0.110363 Vinstue. Ravello
0.105370 Mand med baret (Portræt af Rembrandts far)

Topic 12
skov (1.122667) vej (0.541597) sne (0.355547) Elleslægten (0.169609) eg (0.105070) 

0.442296 Vej i en egeskov
0.393046 Vinteraften i en skov
0.350362 Et ellekrat
0.328495 Vej gennem en egeskov
0.297305 Skovlandskab. Forår
0.289873 I udkanten af skoven
0.289873 Inde i skoven
0.213880 Snelandskab, Søndermarken
0.193334 Studie fra Furesøen
0.136177 Vid udsigt fra Girgenti
0.125589 Parti fra Geels Bakke ved Røjels Bom
0.117446 Tøbrud
0.105646 Aften. Den gamle kone og døden
0.100472 En gøglertrup ankommer til Dyrehavsbakken
0.094174 Kählers bygning bag Banken i Næstved
0.091108 Smedens Hus ved Roskilde Landevej
0.089060 Vester Egede kirke. I baggrunden Gisselfeld kloster
0.083731 Vinterdag med sne i Baldersbrønde
0.080735 To gamle, der holder søndag
0.079125 Klitlandskab ved Haarlem

In [13]:
# Write part of an HTML file with image grouped accoring to topic
with open('tmp.html', 'w') as f:
    topic_ids = transformed.shape[1]
    for topic_id in range(topic_ids):
        f.write('<h3>Emne %d</h3>\n' % (topic_id + 1,))
        indices = (-decomposer.components_[topic_id, :]).argsort()[:5]
        s = ""
        for index in indices:
            if decomposer.components_[topic_id, index] < 0.0001:
                break
            s += "%s. " %  (scaled_feature_matrix.columns[index],)
        f.write('Motiver: ' + s.encode('utf-8') + '<br/>\n')
        indices = (-transformed[:, topic_id]).argsort()[:15]
        for index in indices:
            if transformed[index, topic_id] < 0.0001:
                break
            qid = int(feature_matrix.index[index][32:])
            filename = filename_mapper[feature_matrix.index[index]]
            if filename:
                f.write("<a href='http://wikidata.org/wiki/Q%d'><img src='https://commons.wikimedia.org/w/thumb.php?f=%s&width=200'></a>\n" % (qid, filename,))

In [14]:
# Graph with 'motivs' as nodes
graph = nx.Graph()
for motiv in feature_matrix.columns:
    graph.add_node(motiv)
    
for image, row in feature_matrix.iterrows():
    motivs = row.index[row.nonzero()[0]].tolist()
    for i1 in range(len(motivs) - 1):
        for i2 in range(i1 + 1, len(motivs)):
            graph.add_edge(motivs[i1], motivs[i2])

In [15]:
subgraph = next(nx.connected_component_subgraphs(graph))

In [16]:
# Good position layout is always a problem - here default spring layout is attempted
# pos = nx.layout.spectral_layout(graph)
pos = nx.layout.spring_layout(subgraph, iterations=50)

In [17]:
# Plotting the motiv graph
node_sizes = 50 * feature_matrix.sum(axis=0)[subgraph.nodes()]
nx.draw_networkx_nodes(subgraph, pos=pos, node_size=node_sizes, node_color='r', alpha=0.5, linewidths=0)
nx.draw_networkx_edges(subgraph, nodelist=subgraph.nodes(), pos=pos, alpha=0.05, color='r', linewidths=3)

positions = [pos[node] for node in subgraph.nodes()]
for i in np.argsort(node_sizes)[:-31:-1]:
    plt.text(positions[i][0], positions[i][1], subgraph.nodes()[i], 
             horizontalalignment='center', verticalalignment='center')

ax = plt.gca()
ax.get_xaxis().set_visible(False)
ax.get_yaxis().set_visible(False)
ax.set_position([0, 0, 1, 1])
ax.axis([-0.05, 1.05, -0.05, 1.05])
ax.axis([0.3, 0.7, 0.3, 0.7])

plt.text(0.5, 0.65, u'Motiver i danske kunstværker i Wikidata',
         fontsize=50,
         backgroundcolor=(1, 1, 1),
         horizontalalignment='center', verticalalignment='center')


Out[17]:
<matplotlib.text.Text at 0x7ff6401a4fd0>

In [18]:
# Save the image in a file
plt.gcf().set_size_inches(18, 12, forward=True)
plt.savefig('Danish art motivs from Wikidata.png')

In [19]:
plt.show()



In [ ]: